/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package imp.gestores;

import imp.DAO.*;
import imp.util.*;
import imp.clases.*;

import java.util.ArrayList;

import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.faces.validator.ValidatorException;
import org.ajax4jsf.component.html.HtmlAjaxCommandButton;

import org.richfaces.component.html.HtmlDataTable;

/**
 *
 * @author Alvaro Uyaguari
 */
public class GestorAnalisisFinancieros extends BeanUtil{

    private Emprendimiento currentEmprendimiento;
    private Presupuesto currentPresupuesto;
    private FuenteFinanciamiento currentFuenteFinanciamiento;
    private CostoOperacion currentCostoOperacion;
    private ActividadMensual currentActividadMensual;
    private IngresoMensual currentIngreso;
    private Costo currentCosto;
    private Sueldo currentSueldo;

    private HtmlDataTable tablaPresupuestos;
    private HtmlDataTable tablaFuenteFinanciamientos;
    private HtmlDataTable tablaCostoOperaciones;
    private HtmlDataTable tablaActividadMensuales;
    private HtmlDataTable tablaIngresos;
    private HtmlDataTable tablaCostos;
    private HtmlDataTable tablaSueldos;
    
    private String accionPresupuesto;
    private String accionFuenteFinanciamiento;
    private String accionCostoOperacion;
    private String accionActividadMensual;
    private String accionIngreso;
    private String accionCosto;
    private String accionSueldo;
    
    private Boolean renderPresupuesto;
    private Boolean renderFuenteFinanciamientos;
    private Boolean renderCostoOperaciones;
    private Boolean renderActividadMensuales;
    private Boolean renderIngresos;
    private Boolean renderCostos;
    private Boolean renderSueldos;
    
    
    //Para Buscadores
    private String filtroBusqueda;
   

    private DAO dao = (DAO)ServiceFinder.findBean("SpringHibernateDao");

    public GestorAnalisisFinancieros(){
        this.tablaPresupuestos=new HtmlDataTable();
        this.tablaFuenteFinanciamientos=new HtmlDataTable();
        this.tablaCostoOperaciones=new HtmlDataTable();
        this.tablaActividadMensuales=new HtmlDataTable();
        this.tablaIngresos=new HtmlDataTable();

    }

    // Para Emprendimiento:

    public String grabarEmprendimiento() {

        try {

                dao.flush();
                dao.persist(this.currentEmprendimiento);


        } catch (Exception e) {
            super.addErrorMessage(e.getMessage());
        }

        return null;
    }

    public Emprendimiento getCurrentEmprendimiento() {
        return currentEmprendimiento;
    }

    public void setCurrentEmprendimiento(Emprendimiento currentEmprendimiento) {
        this.currentEmprendimiento = currentEmprendimiento;
        //Actualizo los Totales
        this.actualizarTotales();
        actualizarTotCostos();
    }

    //Metodos para Busuedas:

    public String getFiltroBusqueda() {
    return filtroBusqueda;
    }
    public void setFiltroBusqueda(String filtroBusqueda) {
    this.filtroBusqueda = filtroBusqueda;
    }    
    
    //########## Para Presupuesto: ########## //
     
      public String grabarPresupuesto(){
            if (this.accionPresupuesto.equals("Ins")){

                this.currentEmprendimiento.addPresupuesto(currentPresupuesto);

          }
           this.renderPresupuesto=false;
           
           this.actualizarTotales();
           return null;

       }

       public String cerrarPresupuesto(){
           this.renderPresupuesto=false;
           return null;

       }

       public String eliminarPresupuesto(){
           currentPresupuesto = (Presupuesto)tablaPresupuestos.getRowData();
           this.currentEmprendimiento.removePresupuesto(currentPresupuesto);
           
           
           this.actualizarTotales();
           return null;
       }
       public String editarPresupuesto(){
            this.accionPresupuesto="Mod";
                this.renderPresupuesto=true;
		currentPresupuesto = (Presupuesto)tablaPresupuestos.getRowData();
		return null;
       }
       public String nuevoPresupuesto(){
                this.accionPresupuesto="Ins";
                this.renderPresupuesto=true;
		currentPresupuesto = new Presupuesto();
		return null;
       }

        public void setCurrentPresupuesto(Presupuesto currentPresupuesto) {
            this.currentPresupuesto = currentPresupuesto;
        }

        public Presupuesto getCurrentPresupuesto() {
            return currentPresupuesto;
        }
        

        public HtmlDataTable getTablaPresupuestos() {
            return tablaPresupuestos;
        }

        public String getAccionPresupuesto() {
            return accionPresupuesto;
        }

        public void setAccionPresupuesto(String accion) {
        this.accionPresupuesto = accion;
        }

        public void setTablaPresupuestos(HtmlDataTable tablaPresupuestos) {
            this.tablaPresupuestos = tablaPresupuestos;
        }

        public Boolean getRenderPresupuesto() {
            return renderPresupuesto;
        }

        public void setRenderPresupuesto(Boolean renderPresupuesto) {
            this.renderPresupuesto = renderPresupuesto;
        }

        public String getTotalCredito() {
            return totalCredito;
        }

        public void setTotalCredito(String totalCredito) {
            this.totalCredito = totalCredito;
        }

        public String getTotalPropio() {
            return totalPropio;
        }

        public void setTotalPropio(String totalPropio) {
            this.totalPropio = totalPropio;
        }

    public String getTotalValor() {
        return totalValor;
    }

    public void setTotalValor(String totalValor) {
        this.totalValor = totalValor;
    }

        
        //Metodos Auxiliares para Presupuesto:
        String totalValor;
        String totalPropio;
        String totalCredito;

        public void actualizarTotales(){
        //Saco Totales del Presupuesto:

            int largo=this.currentEmprendimiento.getPresupuestos().size();
            double totalValorD=0;
            double totalPropioD=0;
            double totalCreditoD=0;
            for(int i=0;i<largo;i++){
            totalValorD=totalValorD+this.currentEmprendimiento.getPresupuestos().get(i).getValor();
            totalCreditoD=totalCreditoD+this.currentEmprendimiento.getPresupuestos().get(i).getCredito();
            totalPropioD=totalPropioD+this.currentEmprendimiento.getPresupuestos().get(i).getAporte_propio();
            }
            totalValor=String.valueOf(totalValorD);
            totalCredito=String.valueOf(totalCreditoD);
            totalPropio=String.valueOf(totalPropioD);


        }






        //########## Para FuenteFinanciamiento: ########## //

      public String grabarFuenteFinanciamiento(){
            if (this.accionFuenteFinanciamiento.equals("Ins")){

                this.currentEmprendimiento.addFuentefinanciamiento(currentFuenteFinanciamiento);

          }
           this.renderFuenteFinanciamientos=false;

           this.actualizarTotales();
           return null;

       }

       public String cerrarFuenteFinanciamiento(){
           this.renderFuenteFinanciamientos=false;
           return null;

       }

       public String eliminarFuenteFinanciamiento(){
           currentFuenteFinanciamiento = (FuenteFinanciamiento)tablaFuenteFinanciamientos.getRowData();
           this.currentEmprendimiento.removeFuentefinanciamiento(currentFuenteFinanciamiento);
           return null;
       }
       public String editarFuenteFinanciamiento(){
            this.accionFuenteFinanciamiento="Mod";
                this.renderFuenteFinanciamientos=true;
		currentFuenteFinanciamiento = (FuenteFinanciamiento)tablaFuenteFinanciamientos.getRowData();
		return null;
       }
       public String nuevoFuenteFinanciamiento(){
                this.accionFuenteFinanciamiento="Ins";
                this.renderFuenteFinanciamientos=true;
		currentFuenteFinanciamiento = new FuenteFinanciamiento();
		return null;
       }

        public void setCurrentFuenteFinanciamiento(FuenteFinanciamiento currentFuenteFinanciamiento) {
            this.currentFuenteFinanciamiento = currentFuenteFinanciamiento;
        }

        public FuenteFinanciamiento getCurrentFuenteFinanciamiento() {
            return currentFuenteFinanciamiento;
        }


        public HtmlDataTable getTablaFuenteFinanciamientos() {
            return tablaFuenteFinanciamientos;
        }

        public String getAccionFuenteFinanciamiento() {
            return accionFuenteFinanciamiento;
        }

        public void setAccionFuenteFinanciamiento(String accion) {
        this.accionFuenteFinanciamiento = accion;
        }

        public void setTablaFuenteFinanciamientos(HtmlDataTable tablaFuenteFinanciamientos) {
            this.tablaFuenteFinanciamientos = tablaFuenteFinanciamientos;
        }

        public Boolean getRenderFuenteFinanciamientos() {
            return renderFuenteFinanciamientos;
        }

        public void setRenderFuenteFinanciamientos(Boolean renderFuenteFinanciamientos) {
            this.renderFuenteFinanciamientos = renderFuenteFinanciamientos;
        }





         //########## Para FuenteFinanciamiento: ########## //

      public String grabarCostoOperacion(){
            if (this.accionCostoOperacion.equals("Ins")){

                this.currentEmprendimiento.addCostoOperacion(currentCostoOperacion);

          }
           this.renderCostoOperaciones=false;

           actualizarTotCostos();
           return null;

       }

       public String cerrarCostoOperacion(){
           this.renderCostoOperaciones=false;
           return null;

       }

       public String eliminarCostoOperacion(){
           currentCostoOperacion = (CostoOperacion)tablaCostoOperaciones.getRowData();
           this.currentEmprendimiento.removeCostoOperacion(currentCostoOperacion);
           return null;
       }
       public String editarCostoOperacion(){
            this.accionCostoOperacion="Mod";
                this.renderCostoOperaciones=true;
		currentCostoOperacion = (CostoOperacion)tablaCostoOperaciones.getRowData();
		return null;
       }
       public String nuevoCostoOperacion(){
                this.accionCostoOperacion="Ins";
                this.renderCostoOperaciones=true;
		currentCostoOperacion = new CostoOperacion();
		return null;
       }

        public void setCurrentCostoOperacion(CostoOperacion currentCostoOperacion) {
            this.currentCostoOperacion = currentCostoOperacion;
        }

        public CostoOperacion getCurrentCostoOperacion() {
            return currentCostoOperacion;
        }


        public HtmlDataTable getTablaCostoOperaciones() {
            return tablaCostoOperaciones;
        }

        public String getAccionCostoOperacion() {
            return accionCostoOperacion;
        }

        public void setAccionCostoOperacion(String accion) {
        this.accionCostoOperacion = accion;
        }

        public void setTablaCostoOperaciones(HtmlDataTable tablaCostoOperaciones) {
            this.tablaCostoOperaciones = tablaCostoOperaciones;
        }

        public Boolean getRenderCostoOperaciones() {
            return renderCostoOperaciones;
        }

        public void setRenderCostoOperaciones(Boolean renderCostoOperaciones) {
            this.renderCostoOperaciones = renderCostoOperaciones;
        }

    public String getTotalFijo() {
        return totalFijo;
    }

    public void setTotalFijo(String totalFijo) {
        this.totalFijo = totalFijo;
    }

    public String getTotalVariable() {
        return totalVariable;
    }

    public void setTotalVariable(String totalVariable) {
        this.totalVariable = totalVariable;
    }






    //Metodos Auxiliares para Costo de Operacion:
        String totalFijo;
        String totalVariable;


        public void actualizarTotCostos(){
        //Saco Totales del Presupuesto:

            int largo=this.currentEmprendimiento.getCostosOperacion().size();
            double totalFijoD=0;
            double totalVariableD=0;

            for(int i=0;i<largo;i++){

                if(this.currentEmprendimiento.getCostosOperacion().get(i).getTipoCosto().equals("F")){
                totalFijoD=totalFijoD+this.currentEmprendimiento.getCostosOperacion().get(i).getValor();
                }else{
                totalVariableD=totalVariableD+this.currentEmprendimiento.getCostosOperacion().get(i).getValor();
                }
            }
            totalFijo=String.valueOf(totalFijoD);
            totalVariable=String.valueOf(totalVariableD);



        }




         //########## Para Actividad Mensual: ########## //

      public String grabarActividadMensual(){
            if (this.accionActividadMensual.equals("Ins")){

                this.currentEmprendimiento.addActividadMensual(currentActividadMensual);

          }
           this.renderActividadMensuales=false;

           return null;

       }

       public String cerrarActividadMensual(){
           this.renderActividadMensuales=false;
           return null;

       }

       public String eliminarActividadMensual(){
           currentActividadMensual = (ActividadMensual)tablaActividadMensuales.getRowData();
           this.currentEmprendimiento.removeActividadMensual(currentActividadMensual);
           return null;
       }
       public String editarActividadMensual(){
            this.accionActividadMensual="Mod";
                this.renderActividadMensuales=true;
		currentActividadMensual = (ActividadMensual)tablaActividadMensuales.getRowData();
		return null;
       }
       public String nuevoActividadMensual(){
                this.accionActividadMensual="Ins";
                this.renderActividadMensuales=true;
		currentActividadMensual = new ActividadMensual();
		return null;
       }

        public void setCurrentActividadMensual(ActividadMensual currentActividadMensual) {
            this.currentActividadMensual = currentActividadMensual;
        }

        public ActividadMensual getCurrentActividadMensual() {
            return currentActividadMensual;
        }


        public HtmlDataTable getTablaActividadMensuales() {
            return tablaActividadMensuales;
        }

        public String getAccionActividadMensual() {
            return accionActividadMensual;
        }

        public void setAccionActividadMensual(String accion) {
        this.accionActividadMensual = accion;
        }

        public void setTablaActividadMensuales(HtmlDataTable tablaActividadMensuales) {
            this.tablaActividadMensuales = tablaActividadMensuales;
        }

        public Boolean getRenderActividadMensuales() {
            return renderActividadMensuales;
        }

        public void setRenderActividadMensuales(Boolean renderActividadMensuales) {
            this.renderActividadMensuales = renderActividadMensuales;
        }




 //########## Para Ingresos Mensuales: ########## //

      public String grabarIngreso(){
        if (this.accionIngreso.equals("Ins")){

            this.currentEmprendimiento.addIngreso(currentIngreso);

      }
           this.renderIngresos=false;
           totalesIngresos();

           return null;

       }

       public String cerrarIngreso(){
           this.renderIngresos=false;
           return null;

       }

       public String eliminarIngreso(){
           currentIngreso = (IngresoMensual)tablaIngresos.getRowData();
           this.currentEmprendimiento.removeIngreso(currentIngreso);
           totalesIngresos();
           return null;
       }
       public String editarIngreso(){
            this.accionIngreso="Mod";
                this.renderIngresos=true;
		currentIngreso = (IngresoMensual)tablaIngresos.getRowData();
                totalesIngresos();
		return null;
       }
       public String nuevoIngreso(){
                this.accionIngreso="Ins";
                this.renderIngresos=true;
		currentIngreso = new IngresoMensual();
                totalesIngresos();
		return null;
       }

        public void setCurrentIngreso(IngresoMensual currentIngreso) {
            this.currentIngreso = currentIngreso;
        }

        public IngresoMensual getCurrentIngreso() {
            return currentIngreso;
        }


        public HtmlDataTable getTablaIngresos() {
            return tablaIngresos;
        }

        public String getAccionIngreso() {
            return accionIngreso;
        }

        public void setAccionIngreso(String accion) {
        this.accionIngreso = accion;
        }

        public void setTablaIngresos(HtmlDataTable tablaIngresos) {
            this.tablaIngresos = tablaIngresos;
        }

        public Boolean getRenderIngresos() {
            return renderIngresos;
        }

        public void setRenderIngresos(Boolean renderIngresos) {
            this.renderIngresos = renderActividadMensuales;
        }

    public IngresoMensual geteTotales() {
        return eTotales;
    }

    public void seteTotales(IngresoMensual eTotales) {
        this.eTotales = eTotales;
    }



      
       //Metodos para la Actualizacion de Totales:
       
       private IngresoMensual eTotales;

        public void totalesIngresos(){
        
        int largo=this.currentEmprendimiento.getIngresosmensuales().size();
        //Encero los valores iniciales:
        eTotales=new IngresoMensual();


            for(int n=0;n<largo;n++){
            IngresoMensual im=this.currentEmprendimiento.getIngresosmensuales().get(n);

            double valor=0;

            valor=im.getAnio1();
            eTotales.setAnio1(eTotales.getAnio1()+valor);
            valor=im.getAnio2();
            eTotales.setAnio2(eTotales.getAnio2()+valor);
            valor=im.getAnio3();
            eTotales.setAnio3(eTotales.getAnio3()+valor);
            valor=im.getAnio4();
            eTotales.setAnio4(eTotales.getAnio4()+valor);
            valor=im.getAnio5();
            eTotales.setAnio5(eTotales.getAnio5()+valor);
            
            }

        }




       //########## Para Costos Mensuales: ########## //

      public String grabarCosto(){
        if (this.accionCosto.equals("Ins")){

            this.currentEmprendimiento.addCosto(currentCosto);

      }
           this.renderCostos=false;
           totalesCostos();

           return null;

       }

       public String cerrarCosto(){
           this.renderCostos=false;
           return null;

       }

       public String eliminarCosto(){
           currentCosto = (Costo)tablaCostos.getRowData();
           this.currentEmprendimiento.removeCosto(currentCosto);
           totalesCostos();
           return null;
       }
       public String editarCosto(){
            this.accionCosto="Mod";
                this.renderCostos=true;
		currentCosto = (Costo)tablaCostos.getRowData();
                totalesCostos();
		return null;
       }
       public String nuevoCosto(){
                this.accionCosto="Ins";
                this.renderCostos=true;
		currentCosto = new Costo();
                totalesCostos();
		return null;
       }

        public void setCurrentCosto(Costo currentCosto) {
            this.currentCosto = currentCosto;
        }

        public Costo getCurrentCosto() {
            return currentCosto;
        }


        public HtmlDataTable getTablaCostos() {
            return tablaCostos;
        }

        public String getAccionCosto() {
            return accionCosto;
        }

        public void setAccionCosto(String accion) {
        this.accionCosto = accion;
        }

        public void setTablaCostos(HtmlDataTable tablaCostos) {
            this.tablaCostos = tablaCostos;
        }

        public Boolean getRenderCostos() {
            return renderCostos;
        }

        public void setRenderCostos(Boolean renderCostos) {
            this.renderCostos = renderActividadMensuales;
        }

    public Costo geteTotalesC() {
        return eTotalesC;
    }

    public void seteTotalesC(Costo eTotales) {
        this.eTotalesC = eTotales;
    }





       //Metodos para la Actualizacion de Totales:

       private Costo eTotalesC;

        public void totalesCostos(){

        int largo=this.currentEmprendimiento.getCostos().size();
        //Encero los valores iniciales:
        eTotalesC=new Costo();


            for(int n=0;n<largo;n++){
            Costo im=this.currentEmprendimiento.getCostos().get(n);

            double valor=0;

            valor=im.getAnio1();
            eTotalesC.setAnio1(eTotalesC.getAnio1()+valor);
            valor=im.getAnio2();
            eTotalesC.setAnio2(eTotalesC.getAnio2()+valor);
            valor=im.getAnio3();
            eTotalesC.setAnio3(eTotalesC.getAnio3()+valor);
            valor=im.getAnio4();
            eTotalesC.setAnio4(eTotalesC.getAnio4()+valor);
            valor=im.getAnio5();
            eTotalesC.setAnio5(eTotalesC.getAnio5()+valor);

            }

        }




 //########## Para Sueldos Mensuales: ########## //

      public String grabarSueldo(){
        if (this.accionSueldo.equals("Ins")){

            this.currentEmprendimiento.addSueldo(currentSueldo);

      }
           this.renderSueldos=false;


           return null;

       }

       public String cerrarSueldo(){
           this.renderSueldos=false;
           return null;

       }

       public String eliminarSueldo(){
           currentSueldo = (Sueldo)tablaSueldos.getRowData();
           this.currentEmprendimiento.removeSueldo(currentSueldo);

           return null;
       }
       public String editarSueldo(){
            this.accionSueldo="Mod";
                this.renderSueldos=true;
		currentSueldo = (Sueldo)tablaSueldos.getRowData();

		return null;
       }
       public String nuevoSueldo(){
                this.accionSueldo="Ins";
                this.renderSueldos=true;
		currentSueldo = new Sueldo();

		return null;
       }

        public void setCurrentSueldo(Sueldo currentSueldo) {
            this.currentSueldo = currentSueldo;
        }

        public Sueldo getCurrentSueldo() {
            return currentSueldo;
        }


        public HtmlDataTable getTablaSueldos() {
            return tablaSueldos;
        }

        public String getAccionSueldo() {
            return accionSueldo;
        }

        public void setAccionSueldo(String accion) {
        this.accionSueldo = accion;
        }

        public void setTablaSueldos(HtmlDataTable tablaSueldos) {
            this.tablaSueldos = tablaSueldos;
        }

        public Boolean getRenderSueldos() {
            return renderSueldos;
        }

        public void setRenderSueldos(Boolean renderSueldos) {
            this.renderSueldos = renderActividadMensuales;
        }

        public void pasarListaEmpren(){
           GestorPanelFinanciero gestorPF = super.getBean("gestorPanelFinanciero");
           gestorPF.setEmpren(currentEmprendimiento);
           gestorPF.calculoTablaF();
           llenarReporteFinanciero(gestorPF.reporteFinancieros);
        }

        public void llenarReporteFinanciero(List<ReporteFinanciero> reporteFinancieros){
           int tamano=reporteFinancieros.size();

           //Quito las lineas anteriores de la base de datos:
           int tamanoR=currentEmprendimiento.getReporteFinancieros().size();
           currentEmprendimiento.newReporteFinancieros();
           dao.persist(this.currentEmprendimiento);

           //Pongo las nuevas lineas
           currentEmprendimiento.getReporteFinancieros().clear();
           for (int n=0;n<tamano;n++){
           currentEmprendimiento.addReporteFinanciero(reporteFinancieros.get(n));
           dao.persist(this.currentEmprendimiento.getReporteFinancieros().get(n));
           }

        }

        @Override
        protected void buscar() {
            throw new UnsupportedOperationException("Not supported yet.");
        }


//Otros Metodos Necesarios:

//public void pasarParamatrosProfesion(ActionEvent evento) {
//        Profesion profesion = currentPresupuesto.getProfesion();
//        GestorProfesiones gestorProfesiones = super.getBean("gestorBuscarProfesiones");
//        gestorProfesiones.setCurrentProfesion(profesion);
//        gestorProfesiones.setReRender("panPresupuestos");
//        gestorProfesiones.setFocus("btnBuscar");
//        HtmlAjaxCommandButton boton = (HtmlAjaxCommandButton) evento.getComponent();
//        boton.setOncomplete("Richfaces.showModalPanel('panelProfesion')");
//    }
//pasarParamatrosHabilidad

//public void pasarParamatrosHabilidad(ActionEvent evento) {
//        GestorHabilidades gestorHabilidades = super.getBean("gestorBuscarHabilidades");
//        gestorHabilidades.setCurrentHabilidad(currentHabilidad);
//        gestorHabilidades.setReRender("panelHabilidad");
//        gestorHabilidades.setFocus("btnBuscar");
//        HtmlAjaxCommandButton boton = (HtmlAjaxCommandButton) evento.getComponent();
//        boton.setOncomplete("Richfaces.showModalPanel('panelBuscarHabilidad')");
//    }
//
//
//public void cambioHabilidad(ValueChangeEvent evento){
//FacesContext contexto = FacesContext.getCurrentInstance();
//this.currentHabilidad=(Habilidad)evento.getNewValue();
//}



// public void validarRuc(FacesContext context,
//             UIComponent componentToValidate, Object value)
//     throws ValidatorException {
//
//         String ruc = value.toString();
//         int tamano=ruc.length();
//
//
//         try {
//
//         long convertruc = Long.valueOf(ruc);
//
//
//     } catch (Exception e) {
//         FacesMessage message = new FacesMessage("Ingresar valores numericos.");
//         throw new ValidatorException(message);
//     }
//
//     if (tamano < 13) {
//         FacesMessage message = new FacesMessage("Ingrese 13 digitos numericos.");
//
//         throw new ValidatorException(message);
//     }
//
//         return;
//     }


}
